﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "IGroup.h"
#include "GcmpModelInterface.h"
#include "INoElementIdDbObject.h"


namespace gcmp {

    class IDocument;
    class INdbCopyStrategyReporter;

    /// \brief 组的组件，用于扩展组的能力。
    class GCMP_MODEL_INTERFACE_EXPORT IGroupComponent : public INoElementIdDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IGroupComponent, gcmp::INoElementIdDbObject);
    public:

        /// \brief 为不是组的Element创建默认的组构件
        /// \return 组构件的实例
        static OwnerPtr<IGroupComponent> CreateDefaultGroupComponentForNonGroup();

        /// \brief 为组创建默认的组构件
        /// \return 组构件的实例
        static OwnerPtr<IGroupComponent> CreateDefaultGroupComponentForGroup();

        /// \brief 根据源对象做Ndb拷贝时拷贝、保持的ElementId
        /// \param pSrcElement 源元素
        /// \param pReporter Ndb拷贝策略报告器
        /// \return 
        virtual void NdbCopyReport(const IElement* pSrcElement, INdbCopyStrategyReporter* pReporter) const = 0;

        /// \brief 判断组内元素是否为同步对象
        /// \param elementIdInGroup 组内元素的ElementId
        /// \return 如果是同步对象则返回true，否则返回false
        /// \note 如果对象不是组内元素或不是同步对象，都会返回false
        virtual bool IsSync(const ElementId& elementIdInGroup) const = 0;

        /// \brief 判断是否接受这次更新
        /// \param groupTypeId 组类型的ElementId
        /// \param elementIdInType 组类型的ElementId
        /// \return 如果接受更新则返回true，否则返回false
        virtual bool AcceptSync(GroupEditType type, const ElementId& elementIdInType) const = 0;

        /// \brief 判断是否可以添加ReferenceElement
        /// \param elementIdInType 组类型的ElementId
        /// \return 如果可以添加则返回true，否则返回false
        virtual bool CanAddReferenceElement(const ElementId& elementIdInType) const = 0;

        virtual ~IGroupComponent() {}
     };

}// namespace gcmp


